package com.bestcem.xm.user.service;

import com.bestcem.bp.grpc.v1.base.Page;
import com.bestcem.xm.common.core.domain.web.ServiceResult;
import com.bestcem.xm.component.security.dto.TokenDTO;
import com.bestcem.xm.user.grpc.service.param.ListOrgByPageParam;
import com.bestcem.xm.user.grpc.service.param.ListOrgsByFilterParam;
import com.bestcem.xm.user.grpc.service.param.ListOrgsByPagingParam;
import com.bestcem.xm.user.service.dto.PageResponseDTO;
import com.bestcem.xm.user.service.dto.user.*;

import java.io.IOException;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 公司管理相关服务
 *
 * @author qiongyu.cui <qiongyu.cui@idiaoyan.com>
 * @version v1.0
 * @date 2022/3/1 14:42
 */
public interface OrganizationService {

    /**
     * 根据id更新Organization
     *
     * @param organizationDTO
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/2 18:13
     */
    ServiceResult<Boolean> updateByPrimaryKeySelective(OrganizationDTO organizationDTO);


    /**
     * 根据id更新全量更新Organization
     *
     * @param organizationDTO 可选参数
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/2 18:12
     */
    ServiceResult<Boolean> updateByPrimaryKey(OrganizationDTO organizationDTO);

    /**
     * 根据orgId获取Organization信息
     *
     * @param orgId
     * @return 公司信息
     * @author jishuo.yan <jishuo.yan@idiaoyan.com>
     * @date 2022/03/01 17:30
     */
    ServiceResult<OrganizationDTO> selectByPrimaryKey(String orgId);

    /**
     * 修改公司基础信息
     * XM.apps_mysql.user.util.utils.update_org_settings
     *
     * @param orgId                公司id
     * @param userId               用户id
     * @param updateOrgBaseInfoDTO 需要更新的公司基础信息
     * @return 公司信息
     * @author jishuo.yan <jishuo.yan@idiaoyan.com>
     * @author yun.pan <yun.pan@idiaoyan.com>
     * @date 2022/03/02 15:30
     */
    ServiceResult<String> updateUserOrgInfo(String orgId, String userId, UpdateOrgBaseInfoDTO updateOrgBaseInfoDTO);

    /**
     * 修改个性化设置(公司皮肤)
     *
     * @param token  token信息
     * @param skinVO 皮肤参数
     * @return
     * @author jishuo.yan <jishuo.yan@idiaoyan.com>
     * @author yun.pan <yun.pan@idiaoyan.com>
     * @date 2022/03/02 15:30
     */
    ServiceResult<String> updateOrgSkin(TokenDTO token, SkinDTO skinVO);

    /**
     * 获取公司全部信息
     *
     * @param ipAddress ip地址
     * @param corpCode  公司编码
     * @return company信息
     * @author jishuo.yan <jishuo.yan@idiaoyan.com>
     * @date 2022/03/01 15:30
     */
    ServiceResult<CompanyDTO> getCompanyInfo(String ipAddress, String corpCode);

    /**
     * 根据orgCode查询公司基础信息
     *
     * @param orgCode 公司代号
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.entity.mysql.Organization>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/04 14:19
     */
    ServiceResult<OrganizationDTO> selectByOrgCode(String orgCode);

    /**
     * 根据公司id列表查询公司列表信息
     *
     * @param orgIds 公司id列表信息
     * @param status 状态信息
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.user.OrganizationDTO>>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/07 18:50
     */
    ServiceResult<List<OrganizationDTO>> selectByIdsAndStatus(List<String> orgIds, Integer status);

    /**
     * 根据公司id和状态查询公司信息
     *
     * @param orgId  公司id
     * @param status 公司状态
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.entity.mysql.Organization>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/03 16:51
     */
    ServiceResult<OrganizationDTO> selectByIdAndStatus(String orgId, Integer status);

    /**
     * 根据公司code和状态查询公司信息
     *
     * @param orgCode 公司code
     * @param status  公司状态
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.service.dto.user.OrganizationDTO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/05/27 17:04
     */
    ServiceResult<OrganizationDTO> selectByCodeAndStatus(String orgCode, Integer status);

    /**
     * 创建公司
     *
     * @param organizationDTO
     * @return ServiceResult<String>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @version v1.0
     * @date 2022/3/8 20:46
     */
    ServiceResult<String> insert(OrganizationDTO organizationDTO);

    /**
     * 根据公司id列表查询公司code列表
     *
     * @param orgIds 公司id列表
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < java.lang.String>>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/08 16:59
     */
    ServiceResult<List<String>> selectOrgCodesByIds(List<String> orgIds);

    /**
     * 根据公司id批量获取公司信息
     *
     * @param orgIdSet 公司id
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.user.OrganizationDTO>>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/5/11 13:45
     */
    ServiceResult<List<OrganizationDTO>> selectByOrgIds(Set<String> orgIdSet);

    /**
     * 根据今日日期查询正式套餐还有30天就过期的公司
     *
     * @param currentTime 当前时间
     * @param status
     * @return List<OrganizationDTO>
     * @author yanjishuo <jishuo.yan@idiaoyan.cn>
     * @date 2022/03/10 11:00
     */
    List<OrganizationDTO> getByfomalExpiryTime(LocalDateTime currentTime, List<Integer> status);

    /**
     * 获取套餐过期的公司
     *
     * @param packType
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.user.OrganizationDTO>>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/10 18:10
     */
    ServiceResult<List<OrganizationDTO>> getExpirePackOrg(String packType);


    /**
     * 套餐过期短信邮件发送
     *
     * @param expireEmailDTO
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/10 18:10
     */
    ServiceResult<Boolean> sendPackExpireSmsAndEmail(PackExpireEmailDTO expireEmailDTO) throws IOException;

    /**
     * 更新公司
     *
     * @param dto 公司信息
     * @return ServiceResult<List < OrganizationDTO>>
     * @author yanjishuo <jishuo.yan@idiaoyan.cn>
     * @date 2022/03/08 16:22
     */
    ServiceResult<String> updateOrg(OrganizationDTO dto);

    /**
     * 根据公司id查询投放审核开关和审核人信息
     *
     * @param orgId 公司id
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.service.dto.user.CheckPreferenceDTO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/17 09:40
     */
    ServiceResult<CheckPreferenceDTO> getCheckPreferenceInfo(String orgId);

    /**
     * 设置投放审核开关和审核人
     *
     * @param orgId         公司id
     * @param checkDeliver  审核开关
     * @param checkSmtpId   审核邮箱配置
     * @param userId        审核人userId列表
     * @param operateUserId 操作的用户id
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/17 10:58
     */
    ServiceResult<Boolean> saveCheckPreferenceInfo(String orgId, Integer checkDeliver, String checkSmtpId, List<String> userId, String operateUserId);

    /**
     * 可选参数查询
     *
     * @param organizationDTO 可选参数
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.user.OrganizationDTO>>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/21 20:39
     */
    ServiceResult<List<OrganizationDTO>> selectBySelective(OrganizationDTO organizationDTO);

    /**
     * 初始化免费版和商业版公司参数
     *
     * @param
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/10 18:10
     */
    ServiceResult<Boolean> updateInitFreeOrg();

    /**
     * 获取所有organization信息
     *
     * @param
     * @return 公司信息
     * @author jishuo.yan <jishuo.yan@idiaoyan.com>
     * @date 2022/03/01 17:30
     */
    ServiceResult<List<OrganizationDTO>> getAllOrg();

    /**
     * 租户管理分页获得公司信息
     *
     * @param param
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.service.dto.PageResponseDTO < com.bestcem.xm.user.service.dto.user.OrganizationDTO>>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/05/17 14:01
     */
    ServiceResult<PageResponseDTO<OrganizationDTO>> listOrganizationsByPage(ListOrgByPageParam param);

    /**
     * 根据package_ids查询租户id列表
     *
     * @param packageIdsList 套餐id列表
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.user.OrganizationDTO>>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/5/17 15:27
     */
    ServiceResult<List<String>> selectOrgIdsByPackageIds(List<String> packageIdsList);


    /**
     * 套餐到期/临期短信提醒
     *
     * @param phone 接收者的手机号
     * @param map   封装模版的参数
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/05/24 17:44
     */
    ServiceResult<Boolean> notifyTemporaryReminderBySms(String phone, Map<String, Object> map);

    /**
     * 套餐到期/临期邮件提醒
     *
     * @param email 接收者的邮箱
     * @param map
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/05/25 10:18
     */
    ServiceResult<Boolean> notifyTemporaryReminderByEmail(String email, Map<String, Object> map);

    /**
     * 套餐到期/临期邮件提醒（测试使用）
     *
     * @param email 接收者的邮箱
     * @param map
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/05/25 10:18
     */
    ServiceResult<Boolean> notifyTestTemporaryReminderByEmail(List<String> email, Map<String, Object> map);

    /**
     * 根据搜索条件查询公司列表
     *
     * @param orgConditionDTO 公司搜索条件
     * @param statuses        组织状态
     * @param search          公司编码，公司名称模糊查询条件
     * @param fields          限定返回字段
     * @param limit           限定返回行数
     * @return 公司列表
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 14:20 2022/6/28
     */
    ServiceResult<List<OrganizationDTO>> listOrganizations(OrgConditionDTO orgConditionDTO, List<Integer> statuses, String search, List<String> fields, Integer limit);

    /**
     * 根据搜索条件查询公司列表
     *
     * @param orgConditionDTO 公司搜索条件
     * @param statuses        组织状态
     * @param search          公司编码，公司名称模糊查询条件
     * @param fields          限定返回字段
     * @param limit           限定返回行数
     * @param offset          偏移量
     * @return 公司列表
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 14:20 2022/6/28
     */
    ServiceResult<PageResponseDTO<OrganizationDTO>> listOrgsByPaging(OrgConditionDTO orgConditionDTO, ListOrgsByPagingParam param, Page page);

    /**
     * 根据搜索条件查询公司列表，限定返回行数
     *
     * @param orgConditionDTO 公司搜索条件
     * @param limit           限定返回行数
     * @return 公司列表
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 14:06 2022/7/1
     */
    ServiceResult<List<OrganizationDTO>> listOrganizations(OrgConditionDTO orgConditionDTO, Integer limit);

    /**
     * 根据筛选条件筛选公司信息
     *
     * @param param
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.service.dto.PageResponseDTO < com.bestcem.xm.user.service.dto.user.OrganizationDTO>>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/05 16:14
     */
    ServiceResult<PageResponseDTO<OrganizationDTO>> listOrgsByFilter(ListOrgsByFilterParam param);

    /**
     * 根据公司code集合查询公司
     *
     * @param orgCodes
     * @return ServiceResult<List < OrganizationDTO>>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/7/5 17:52
     */
    ServiceResult<List<OrganizationDTO>> listByCodes(List<String> orgCodes);

    /**
     * 创建租户，短信通知
     *
     * @param email
     * @param dataMap
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Void>
     * @author zhangfeng <feng.zhang@idiaoyan.com>
     * @date 2022/7/7 17:24
     */
    void notifyCompanyAcceptByEmail(String email, Map<String, String> dataMap);

    /**
     * 创建租户，邮件通知
     *
     * @param phone
     * @param dataMap
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Void>
     * @author zhangfeng <feng.zhang@idiaoyan.com>
     * @date 2022/7/7 17:24
     */
    void notifyCompanyAcceptBySms(String phone, Map<String, String> dataMap);

    /**
     * 查询inner_flag为空的租户id列表
     *
     * @return java.util.List<com.bestcem.xm.user.service.dto.user.OrganizationDTO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/13 18:16
     */
    List<OrganizationDTO> selectByInnerFlagIsNull();

    /**
     * 将所有inner_flag为空的租户的inner_flag更新为false
     *
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/13 18:09
     */
    void updateInnerFlagIsNullToFalse();

    /**
     * 根据orgId列表更新innerFlag字段
     *
     * @param orgIds    租户id
     * @param innerFlag 内部用户标识
     * @return void
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/13 18:36
     */
    void updateInnerFlagByOrgIds(List<String> orgIds, Integer innerFlag);

    /**
     * 判断code是否存在
     *
     * @param code
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author zhangfeng <feng.zhang@idiaoyan.com>
     * @date 2022/8/4 13:54
     */
    ServiceResult<Boolean> existsByCode(String code);
}
